<!DOCTYPE html>
<html>
  <head>
    <title>解构</title>
    <style></style>
  </head>
  <body>
    <script>
      console.log(typeof Symbol())
      // Set
      {
        // Set类似数组，只不过没有重复的值（判断类似于 '==='，只不过NaN被认为等于自身）
        // Set初始化可以接受数组，或其他拥有Iterable的数据类型
        const s = new Set([1, 2, 3, 4, 4, 5, 6, 6, 7])
        console.log(s)

        // 实例属性
        // s.size

        // -----------------------------
        // 操作方法
        // s.add(value)
        // s.delete(value)
        // s.has(value)
        // s.clear()

        // -----------------------------
        // 遍历方法，遍历顺序就是插入顺序
        // s.keys()：返回键名的遍历器
        // s.values()：返回键值的遍历器
        // s.entries()：返回键值对的遍历器
        // s.forEach((value, key) => { ... })：使用回调函数遍历每个成员
        // or...of...遍历

        // WeakSet，和Set类似，只有两点不同：1、值只能是对象 2、对象是弱引用，即回收时不考虑是否被WeakSet引用
      }

      // Map
      {
        // Map是hash结构，提供了值-值，打破了Object只能使用键值对的限制
        const m = new Map()

        // 实例属性
        // m.size

        // -----------------------------
        // 操作方法
        // m.set(key, value)
        // m.get(key)
        // m.has(key)
        // m.delete(key)
        // m.clear()
        m.set('a', 1)
        m.set({ b: 2 }, 2)

        // 遍历方法，遍历顺序就是插入顺序
        // m.keys()：返回键名的遍历器
        // m.values()：返回键值的遍历器
        // m.entries()：返回键值对的遍历器
        // m.forEach((value, key, map) => { ... })：使用回调函数遍历每个成员
        // for...of...遍历

        // Map可以直接转化成数组
        console.log([...m])

        // 对象转化为Map
        // let map = new Map(Object.entries(obj))

        // 转化为Json：和object类似，需要全部是字符；否则可以转化成数组Json

        // WeakMap 见WeakSet
      }
    </script>
  </body>
</html>
